<?php
/**
 * Game_Battle_Trade
 *
 * Класс Game_Battle_Trade отвечает за передвижения торговцев
 *
 * @author Дмитрий Кузьма <kouzma.d@gmail.com>
 * @version 1.0
 */
class Game_Battle_Trade extends Game_Battle_Move {
	
	protected $_battleType = 'trade'; // тип сражения (это может быть и подкрепление)
	
	/**
	 * Создает новый объект для расчета торговой операции
	 *

	 * @param Game_Place $objPlaceGoal - место, в котороt пребывают войска
	 * @param Game_Unit_UnitsGroup $objSentGroup - Группа отправленных войск
	 * @param bool $isAutoCalculate - флаг, производить ли посдечт сразу
	 * 
	 */
	public function __construct(Game_Place $objPlaceGoal, Game_Unit_UnitsGroup $objSentGroup, $isAutoCalculate = true) {
		parent::__construct($objPlaceGoal, $objSentGroup);
		
		if ($isAutoCalculate) $this->calculate();

	}	
	
	/**
	 * Вычисляет результаты подкрепления
	 */
	public function calculate() {
		// Если получатель и отправитель - разные места
		if ($this->_objPlaceSender->id != $this->_objPlaceGoal->id) {
			$objUnitGroupResources = new Game_Unit_GroupResource($this->_objSentGroup->id);
			// Если есть перевозимые ресурсы, то инкрементим их
			if ($objUnitGroupResources->id) {
				$objResources = new Game_Resource($objUnitGroupResources);
				$this->_objPlaceGoal->objResourcesWithProduction->increase($objResources);
				$this->_objPlaceGoal->saveResourcesData();
			}
			
			// организовываем возвращение торговцев
			$objDb = Service_Database::instance();
			$speed = Game_Building_Market::getTraderSpeed();
			$objCoordinates = new Game_Coordinates($this->_objPlaceSender);
			$moveDeltaTime = $objCoordinates->getMoveTime($speed, new Game_Coordinates($this->_objPlaceGoal));
				
			$objUnitsGroup = new Game_Unit_UnitsGroup();
			$objUnitsGroup->setCoordinates($objCoordinates);
			$objUnitsGroup->setField('ID_place_owner', $this->_objPlaceSender->id);
			$objUnitsGroup->setField('move_type', 'trade');
			$objUnitsGroup->setField('amount', $this->_objSentGroup->getField('amount'));
			$objUnitsGroup->save();
			
			// Сохраняем непосредственно событие возвращения торговцев
			$stmt = "SELECT `event_time` FROM `game_event` WHERE `ID_essence` = '" . $this->_objSentGroup->id . "' AND `event_type` = 'trade'";
			$attackTime = $objDb->selectSimpleField($stmt);
			$tradersReturnTime = Service_Date::timeWithDelta($attackTime, $moveDeltaTime);
			$objGameEvent = new Game_Event(array(
					'ID_place' => $this->_objPlaceSender->id,
					'ID_user' => $this->_objPlaceSender->getField('ID_user'),
					'event_type' => 'trade',
					'ID_essence' => $objUnitsGroup->id,
					'amount' => 1,
					'event_time' => $tradersReturnTime,
					'event_time_additional_end' => $tradersReturnTime
			));
			$objGameEvent->save();
		}
		else {
			// Когда торговец возвращается ничего делать не надо кроме непосредственно удаления группы отправки
		}
		// Удаляем группу отправки
		$this->_objSentGroup->delete();
		
	}
}
?>